package com.itheima01.dao;

import com.itheima01.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.javassist.compiler.ast.Keyword;

import java.util.List;

public interface UserMapper {

    List<User> findAllUsers();

    List<User> findAllUsers2();

    /*
        TODO: 参数映射
        1. 如果参数列表只有一个参数,参数会自动映射(加不加无所谓)

        2. 如果参数列表有多个参数(两个及以上),参数需要手动映射
            @Param("username") : 让mybatis知道username指的是参数列表的第一个参数
            mybatis中的引用
                    #{username}

        3. 如果参数只有一个javabean
                    #{javabean的属性名}
     */

    int deleteUserById(Integer id);

    int addUser(@Param("username") String xx,
                @Param("birthday") String birthday,
                @Param("sex") String sex,
                @Param("address") String address);

    int addUser2(User user);

    int addUser3(@Param("user") User user,
                 @Param("extra") User extra);

    /*
     * TODO: 模糊查询
     * */

    List<User> findUserByUsernameKeyword1(String keyword);
    List<User> findUserByUsernameKeyword2(String keyword);
    List<User> findUserByUsernameKeyword3(@Param("keyword") String keyword);
    List<User> findUserByUsernameKeyword4(String keyword);

    /*
     * TODO: 主键回填
     *       插入一条记录,并返回此记录的主键
     * */
    int addUser4(User user);
    int addUser5(User user);

    /*
     *  TODO: 动态sql
     *
     * */
    //if: 动态条件拼接
    List<User> findUserByUsernameAndSex(@Param("sex") String sex,
                                        @Param("username") String username);

    /*
     * # 动态sql2
     *   需求: 修改某个用户信息
     *       update user
     *           set username = ?,   -- 动态
     *               birthday = ?,    -- 动态
     *               sex = ?,         -- 动态
     *               address = ?      -- 动态
     *          where id = ?;
     *   参数: User
     *   返回值: void
     *
     * */
    // update: 动态修改
    void updateUserById(User user);

    //foeach : 批量查询
    // 如果参数被用于标签属性中,参数映射必须要写
//    List<User> findUserByIds(@Param("ids") List<Integer> ids);
    List<User> findUserByIds(@Param("ids") Integer[] ids);

    //批量删除
    int deleteUserByIds(@Param("ids") Integer[] ids);
}
